package control
import(
	"fmt"
	"project06/server/utils"
	"project06/common/message"
	"net"
	"encoding/json"
	"project06/server/model"

)
type Control struct{
	Conn net.Conn
	UserId int
}

func(this *Control) NotifyOtherUserOnline(userId int){
	usersMap:=userMgr.GetAllonlineUser()
	for id,uC:=range usersMap{
		if id==userId{
			continue
		}
		uC.NotifyMeOnline(userId)
	}
}

func (this *Control) NotifyMeOnline(userId int){
	var resMes message.Message
	resMes.Type=message.UserStatusNotifyMesType
	var userStatusNotifyMes message.UserStatusNotifyMes
	userStatusNotifyMes.UserId=userId
	userStatusNotifyMes.Status=message.UserOnLine

	data,err:=json.Marshal(userStatusNotifyMes)
	if err!=nil{
		fmt.Println("序列化userStatusNotifyMes失败,err=",err)
	}
	resMes.Data=string(data)
	data,err=json.Marshal(resMes)
	if err!=nil{
		fmt.Println("序列化resMes失败,err=",err)
	}

	tf:=&utils.Transfer{
		Conn:this.Conn,
	}
	err=tf.WritePkg(data)
	if err!=nil{
		fmt.Println("tf.WritePkg err",err.Error())
		return
	}
	return

}
func (this *Control)ServiceRegisterProcess(mes *message.Message)(err error){
	//反序列化LoginMes
	var RegisterMes message.RegisterMes 
	data:=mes.Data
	err=json.Unmarshal([]byte(data),&RegisterMes)
	if err!=nil{
		fmt.Println("反序列化LoginMes失败，err",err)
		return
	}

	//声明remMes
	var resMes message.Message
	var RegisterResMes message.RegisterResMes 
	resMes.Type=message.RegisterResMesType

	err=model.MyUserDao.Register(&RegisterMes.User)
	if err !=nil{
		if err ==model.ERR_USER_EXISTS{
			RegisterResMes.Code=600
			RegisterResMes.Error=err.Error()
		}else{
			RegisterResMes.Code=505
			RegisterResMes.Error="注册其他错误"
		}

	}else{
		RegisterResMes.Code=200
	}
	//fmt.Println("user=",user)
	//将LoginResMes序列化
	dataRes,err:=json.Marshal(RegisterResMes)
	if err!=nil{
		fmt.Println("序列化RegisterResMes失败，err",err)
		return
	}
	//将resMes序列化
	resMes.Data=string(dataRes)
	data2,err :=json.Marshal(resMes)
	if err!=nil{
		fmt.Println("序列化ResMes失败，err",err)
		return
	}
	//发送数据
	//fmt.Println("服务器发送了LoginResMes给客户端",string(data2))
	tf:=&utils.Transfer{
		Conn:this.Conn,
	}
	err=tf.WritePkg(data2)
	return

}
func (this *Control)ServiceLoginProcess(mes *message.Message)(err error){
		
	//反序列化LoginMes
	var LoginMes message.LoginMes 
	data:=mes.Data
	err=json.Unmarshal([]byte(data),&LoginMes)
	if err!=nil{
		fmt.Println("反序列化LoginMes失败，err",err)
		return
	}
	//声明remMes
	var resMes message.Message
	var LoginResMes message.LoginResMes 
	resMes.Type=message.LoginResMesType

	user,err:=model.MyUserDao.Login(LoginMes.UserId,LoginMes.UserPwd)
	if err !=nil{
		if err ==model.ERR_USER_NOEXISTS{
			LoginResMes.Code=500
			LoginResMes.Error=err.Error()
		}else if err == model.ERR_USER_PWD{
			LoginResMes.Code=403
			LoginResMes.Error=err.Error()
		}else{
			LoginResMes.Code=505
			LoginResMes.Error="服务器内部错误"
		}

	}else{
		LoginResMes.Code=200
		//登录成功之后，需要将UserId，放到onlineUser里面
		this.UserId = LoginMes.UserId
		userMgr.AddonlineUser(this)
		this.NotifyOtherUserOnline(LoginMes.UserId)
		//还需要遍历onlineUser里面的UserId，放到LoginResMes里面的UsersId切片中返回
		usersMap:=userMgr.GetAllonlineUser()
		for i,_:=range usersMap{
			LoginResMes.UsersId=append(LoginResMes.UsersId,i)
		}
		fmt.Println("登录成功")
	}
	fmt.Println("user=",user)
	

	//将LoginResMes序列化
	dataRes,err:=json.Marshal(LoginResMes)
	if err!=nil{
		fmt.Println("序列化LoginResMes失败，err",err)
		return
	}
	//将resMes序列化
	resMes.Data=string(dataRes)
	data2,err :=json.Marshal(resMes)
	if err!=nil{
		fmt.Println("序列化ResMes失败，err",err)
		return
	}
	//发送数据
	//fmt.Println("服务器发送了LoginResMes给客户端",string(data2))
	tf:=&utils.Transfer{
		Conn:this.Conn,
	}
	err=tf.WritePkg(data2)
	return
}